package kMeans.main;

import gui.GUI;

import java.util.ArrayList;

import kMeans.core.Cluster;
import kMeans.core.KMeans;
import kMeans.core.PadraoTreinamento;

public class MainKMeans {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Cluster [] clustersK = null;
		KMeans kMeans = new KMeans();
		ManipulacaoArquivos manipArquivos = new ManipulacaoArquivos();
		
		//Alterar aqui a localizacao completa dos arquivos.
		//Windows: "C:\\Diretorio\\KMeans\\..." 
		//Linux: "/home/vinicius/KMeans/..."
		String nomeArquivoTreino = "C:\\Documents and Settings\\Jose\\Meus documentos\\workspace\\KMeans-OneClass\\kMeans\\files\\DadosTreinamento2.dat";
		String nomeArquivoTeste = "C:\\Documents and Settings\\Jose\\Meus documentos\\workspace\\KMeans-OneClass\\kMeans\\files\\DadosTeste2.dat";
		
		PadraoTreinamento [] aTreinamento = manipArquivos.getTrainingData(nomeArquivoTreino);
		PadraoTreinamento [] aTest = manipArquivos.getTestData(nomeArquivoTeste);

	    //Inicializacao dos Clusters.
		int numeroClusters = 0;
		do {
			numeroClusters = (int) (Math.random() * 10);
		} while (numeroClusters == 0 || numeroClusters == 1);
		
		clustersK = new Cluster[numeroClusters];
	    for (int i = 0; i < numeroClusters; i++) {
	    	ArrayList<Double> clusterCenter = new ArrayList<Double>();
	    	clusterCenter.add(Math.random());
	    	clusterCenter.add(Math.random());
	    	
	    	clustersK[i] = new Cluster(i, 1.5, clusterCenter); //PoG!
		}
	    
	    //Treinamento.
	    boolean isCentroidMoving = true;
	    int n = 0;
	    int numMaxIterations = 500;
	    GUI pGUI = null;
	    
	    while(isCentroidMoving && n < numMaxIterations) {
		    kMeans.train(aTreinamento, clustersK);
		    isCentroidMoving = kMeans.adjustCenter(clustersK, pGUI);
		    n++;
	    }

	    //Teste.
	    ArrayList noveltyDetected = kMeans.test(aTest, clustersK);
	    
	    //Saida.
	    System.out.println("Parametros: Novelty Distance: "+clustersK[0].getNoveltyDistance()+"\t Threshold: "+clustersK[0].THRESHOLD+"");
	    System.out.println("            Clusters: "+clustersK.length +"\t      Execucoes para Treino: "+n);
	    System.out.println("            Falsos Positivos: "+((Integer) noveltyDetected.get(0)).intValue() + "\tFalsos Negativos: "+((Integer) noveltyDetected.get(1)).intValue()+"\n");

	}	
}

